package com.shiyu.exam.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shiyu.exam.common.Result;
import com.shiyu.exam.entity.ExamRecord;
import com.shiyu.exam.service.ExamRecordService;
import com.shiyu.exam.service.ExamService;
import com.shiyu.exam.vo.ExamRankingVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 考试记录控制器 - 处理考试记录管理相关的HTTP请求
 * 包括考试记录查询、分页展示、成绩排行榜等功能
 */
@RestController  // REST控制器，返回JSON数据
@RequestMapping("/api/exam-records")  // 考试记录API路径前缀
@Tag(name = "考试记录管理", description = "考试记录相关操作，包括记录查询、成绩管理、排行榜展示等功能")  // Swagger API分组
public class ExamRecordController {

    @Autowired
    private ExamService examService;
    @Autowired
    private ExamRecordService examRecordService;

    /**
     * 分页查询考试记录
     */
    @GetMapping("/list")  // 处理GET请求
    @Operation(summary = "分页查询考试记录", description = "支持多条件筛选的考试记录分页查询，包括按姓名、状态、时间范围等筛选")
    // API描述
    public Result<Page<ExamRecord>> getExamRecords(
            @Parameter(description = "当前页码，从1开始", example = "1") @RequestParam(defaultValue = "1") Integer page,
            @Parameter(description = "每页显示数量", example = "20") @RequestParam(defaultValue = "20") Integer size,
            @Parameter(description = "学生姓名筛选条件") @RequestParam(required = false) String studentName,
            @Parameter(description = "学号筛选条件") @RequestParam(required = false) String studentNumber,
            @Parameter(description = "考试状态，0-进行中，1-已完成，2-已批阅") @RequestParam(required = false) Integer status,
            @Parameter(description = "开始日期，格式：yyyy-MM-dd") @RequestParam(required = false) String startDate,
            @Parameter(description = "结束日期，格式：yyyy-MM-dd") @RequestParam(required = false) String endDate
    ) {
        //创建page对象
        Page<ExamRecord> examRecordPage = new Page<>(page, size);
        //创建Lambda查询条件
        LambdaQueryWrapper<ExamRecord> examRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //封装查询条件
        examRecordLambdaQueryWrapper
                .like(StringUtils.hasLength(studentName)
                        , ExamRecord::getStudentName, studentName);
        //将status转换为 进行中、已完成、已批阅
        if (status != null) {
            String strStatus = "";
            switch (status) {
                case 0:
                    strStatus = "进行中";
                    break;
                case 1:
                    strStatus = "已完成";
                    break;
                case 2:
                    strStatus = "已批阅";
                    break;
            }
            examRecordLambdaQueryWrapper.eq(ExamRecord::getStatus, strStatus);
        }
        examRecordLambdaQueryWrapper.ge(StringUtils.hasLength(startDate), ExamRecord::getStartTime, startDate);
        examRecordLambdaQueryWrapper.le(StringUtils.hasLength(endDate), ExamRecord::getEndTime, endDate);
        /**
         *
         * 关于 Page 对象复用的解释：
         * ① new Page<>(page, size) 仅创建了一个“分页参数容器”，此时 records 与 total 均为空。
         * ② examRecordService.page(Page, Wrapper) 会复用同一个 Page 实例：
         *    a. 先执行 SELECT COUNT(...) 将总记录数写入 page.total
         *    b. 再执行 SELECT ... LIMIT ... 将本页数据写入 page.records
         * ③ 方法返回的仍是同一个 page 引用，因此 controller 中只需一次声明即可拿到完整分页数据。
         *
         *
         * 调用自带的方法查询
         */
        examRecordPage = examRecordService.page(examRecordPage, examRecordLambdaQueryWrapper);
        return Result.success(examRecordPage);
    }

    /**
     * 根据ID获取考试记录详情
     */
    @GetMapping("/{id}")  // 处理GET请求
    @Operation(summary = "获取考试记录详情", description = "根据记录ID获取考试记录的详细信息，包括试卷内容和答题情况")
    // API描述
    public Result<ExamRecord> getExamRecordById(
            @Parameter(description = "考试记录ID") @PathVariable Integer id) {

        return Result.success(null);
    }

    /**
     * 删除考试记录
     */
    @DeleteMapping("/{id}")  // 处理DELETE请求
    @Operation(summary = "删除考试记录", description = "根据ID删除指定的考试记录")  // API描述
    public Result<Void> deleteExamRecord(
            @Parameter(description = "考试记录ID") @PathVariable Integer id) {
        //调用业务逻辑层
        examRecordService.removeExamRecordById(id);
        return Result.success("删除成功");
    }

    /**
     * 获取考试排行榜 - 优化版本
     * 使用SQL关联查询，一次性获取所有需要的数据，性能提升数百倍
     *
     * @param paperId 试卷ID，可选参数
     * @param limit   显示数量限制，可选参数
     * @return 排行榜列表
     */
    @GetMapping("/ranking")  // 处理GET请求
    @Operation(summary = "获取考试排行榜", description = "获取考试成绩排行榜，支持按试卷筛选和限制显示数量，使用优化的SQL关联查询提升性能")
    // API描述
    public Result<List<ExamRankingVO>> getExamRanking(
            @Parameter(description = "试卷ID，可选，不传则显示所有试卷的排行") @RequestParam(required = false) Integer paperId,
            @Parameter(description = "显示数量限制，可选，不传则返回所有记录") @RequestParam(required = false) Integer limit
    ) {
        // 使用优化的查询方法，避免N+1查询问题
        List<ExamRankingVO> examRankingVOList = examRecordService.getExamRankingVOList(paperId, limit);
        return Result.success(examRankingVOList);
    }
} 